#include <my_head.h>

typedef struct _Msg{
    int id;         // 学号
    char gender;    // 性别
    short score;    // 成绩
    char name[16];  // 姓名
}msg_t;

int main(int argc, const char *argv[]){
    FILE *fp = NULL;
    if(NULL == (fp = fopen("hello.txt", "w")))
        ERR_LOG("fopen error");
    // 1.写入整数
        int x1 = 1234;
        // 会将整数1234写入文件 但是由于我们的文件是文本文件 只能以字符形式显示文件内容
        // 所以看到的内容可能会是乱码。。。。
        fwrite(&x1, 1, 4, fp);
        // 把数据按原方式读出来是没问题的
        fclose(fp); // 关闭再打开的目的是为了重置光标到文件开头
        if(NULL == (fp = fopen("hello.txt", "r")))
            ERR_LOG("fopen error");
        int x2 = 0;
        fread(&x2, 1, 4, fp);
        printf("x2 = [%d]\n", x2); // 1234
    // 2.写入字符串
        fclose(fp); // 关闭再打开的目的是为了重置光标到文件开头
        if(NULL == (fp = fopen("hello.txt", "w")))
            ERR_LOG("fopen error");
        char buff[20] = "hello world";
        // 注意 fwrite 函数的第三个参数不要草率的写 sizeof() 或者 strlen() 
        // 要具体情况具体分析 有时可能写常量  有时可能写表达式
        //fwrite(buff, 1, strlen(buff), fp);
        //fwrite(buff, 1, sizeof(buff), fp);
        fwrite(buff, 1, 11, fp);
        // 把数据按原方式读出来
        fclose(fp);
        if(NULL == (fp = fopen("hello.txt", "r")))
            ERR_LOG("fopen error");
        char buff2[20] = {0};
        fread(buff2, 1, sizeof(buff2), fp);//
        printf("buff2 = [%s]\n", buff2); // hello world
    // 3.写入结构体
        fclose(fp);
        if(NULL == (fp = fopen("hello.txt", "w")))
            ERR_LOG("fopen error");
        msg_t msg = {
            1001, 
            'M',
            98,
            "zhangsan"
        };
        fwrite(&msg, 1, sizeof(msg), fp);
        // 把数据按原方式读出来
        fclose(fp);
        if(NULL == (fp = fopen("hello.txt", "r")))
            ERR_LOG("fopen error");
        msg_t msg2;
        fread(&msg2, 1, sizeof(msg2), fp);
        printf("%d %c %d %s\n", msg2.id, msg2.gender, msg2.score, msg2.name); // 1001 M 98 zhangsan
    fclose(fp);
    return 0;
}